/**
 * 分析Ext.js
 */

/**
 * 第一部分：对象属性的添加和设置
 */
Person = {
	sex : 'woman'// 初始属性设置
};

Person.applay = function(source, copy, defaults) {
	if (defaults) {
		Person.applay(source, defaults)
	}
	if (source && copy && typeof copy == 'object') {
		for (var p in copy) {
			// alert(p);
			// p是属性名，通过source[p] = copy[p];对source进行属性的添加和设置。
			// 如果copy中的属性列表包含有defaults的属性，则source中采用的是copy中的属性和对应的值。
			source[p] = copy[p];
		}
	}
	return source;
};

/**
 * 一、传递的是{}配置列表时
 */
// 1、不传defaults的情况
Person.applay(Person, {
	name : 'wujinli',
	age : 26
});
 alert(Person.name);// 输出属性名为name的属性值，输出结果：wujinli，也可以用 alert(Person["name"])

// 2、传defaults并且第二个参数的属性列表中不包含第三个参数的属性的情况
Person.applay(Person, {
	age : 26
}, {
	name : 'wujinli'
});
// alert(Person.name);// 输出属性名为name的属性值，输出结果：wujinli，也可以用 alert(Person["name"])

// 3、传defaults并且第二个参数的属性列表中有包含第三个参数的属性的情况
Person.applay(Person, {
	name : '丫梨',
	age : 26
}, {
	name : 'wujinli'
});
// alert(Person.name);// 输出属性名为name的属性值，输出结果：丫梨，也可以用 alert(Person["name"])

/**
 * 二、传递的是对象时
 */
Child = function() {
	this.farther = "farther-name";
	this.mother = "mother-name";
};
Person.applay(Person, new Child());
// alert(Person.farther);// 输出属性名为farther的属性值，输出结果：farther-name
